package com.lh0811.forge.dependency.basic_code;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.StringUtils;
import com.alibaba.fastjson2.JSON;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

@Slf4j
public class DataSetUtil {

    @Getter
    @Setter
    @AllArgsConstructor
    @NoArgsConstructor
    public static class STFDataSetItem {
        // 指令任务
        private String instruction;
        // 上下文
        private String input;
        // 期望AI输出
        private String output;
    }


    private static List<String> instructionList = Lists.newArrayList(
            "请判断这句话的情感倾向是正面还是负面？",
            "这句话传达的情绪属于积极还是消极？",
            "能辨别下这句话的情感色彩是褒还是贬吗？",
            "这句话的情感基调是正向还是负向的？",
            "请解析该语句体现的是乐观还是悲观情绪？",
            "这句话的情感属性属于肯定还是否定？",
            "帮忙识别下这个句子的感情是正面还是反面？",
            "这句话的情感走向是积极型还是消极型？",
            "请判别文字中蕴含的情绪是阳光还是阴郁？",
            "这个表达的情感维度偏向积极端还是消极端？",
            "分析语句携带的是正能量还是负能量？",
            "请解读这句话的情感坐标在积极象限还是消极象限？",
            "这句话的情感指纹呈现正面特征还是负面特征？",
            "该表述映射出的情绪光谱偏向哪一极？",
            "请检测文本中的情感信号是正向还是逆向？",
            "这句话的情感磁场吸引积极反馈还是消极反馈？",
            "请解构该语句的情感DNA是积极型还是消极型？",
            "这个表达在情感天平上更倾向哪一端？",
            "请破译这句话的情感密码属于积极序列还是消极序列？",
            "该文本的情感脉搏显示的是乐观还是悲观？",
            "这句话在情感色谱上呈现暖色调还是冷色调？",
            "请评估该表达的情感矢量指向哪个方向？",
            "这句话的情感基因编码是积极型态还是消极型态？",
            "请解析文字中的情绪波动是上行趋势还是下行趋势？",
            "这个表述在情感罗盘上指示的是积极方位吗？",
            "请鉴别该语句的情感化学性质是酸性（消极）还是碱性（积极）？",
            "这句话的情感拓扑结构呈现积极特征吗？",
            "请解调该文本中隐藏的情感频率是高频（积极）还是低频（消极）？",
            "这句话的情感力学显示的是推力（积极）还是阻力（消极）？",
            "请测绘该表达在情感地图上的坐标位置属性",
            "这句话的情感生物标记显示的是健康（积极）还是病变（消极）？",
            "请对该语句进行情感极性鉴定"
    );


    private static List<String> disActiveList = Lists.newArrayList(
            "经分析，该语句呈现明显负面情绪",
            "检测结果显示这句话包含消极情感要素",
            "文本分析表明表达中带有悲观倾向",
            "语义解析确认该话语具有否定性情感",
            "研判发现文字内容传达出消极态度",
            "深度分析揭示文本蕴含强烈负面情绪",
            "多维度评估证实消极情感特征显著",
            "交叉验证显示该表达极具负面倾向",
            "情感强度分析表明消极性达到预警阈值",
            "文本中反复出现的否定词汇强化了悲观基调",
            "结合文本与潜在语气推测，消极情感显著",
            "即便剥离语境，字面情感仍呈负面特征",
            "假设转换为视觉符号，将呈现暗色调情感",
            "多模态分析中文本维度消极性占主导",
            "标点使用模式支持负面情感判断",
            "句法层面否定结构增强消极表达",
            "语义网络检测到负面概念集群",
            "语用分析揭示隐含批评意图",
            "情感粒度分析显示微观负面特征",
            "跨层级一致性验证支持消极判断",
            "基于该文本生成的情感回应呈现消极延续",
            "在对话系统中触发负面应对机制",
            "文本续写实验显示情感负向迁移",
            "生成对抗网络识别出负面模式特征",
            "语言模型预测后续情感维持消极",
            "文本情感影响读者认知偏向消极",
            "阅读后效测试显示情绪感染负面"
    );
    private static List<String> activeList = Lists.newArrayList(
            "通过分析，这句话传达的是积极情绪",
            "经过评估，该语句呈现正面情感倾向",
            "解析结果显示，此文本具有乐观情感色彩",
            "经研判，文字内容展现出建设性情感基调",
            "分析表明，该表达蕴含正向情感价值",
            "通过检测，该句被判定为积极情感表达",
            "经过情感计算，文本被归类为正向情绪范畴",
            "经语义分析，这句话被确认为传递积极态度",
            "通过算法识别，该内容被标注为乐观情感类型",
            "经自然语言处理，语句被识别出正面情感特征",
            "基于情感分析模型的计算结果，该文本的情感极性呈正向分布",
            "通过NLP技术解析，语句的情感向量指向积极维度",
            "依据情感词典匹配结果，该表达在效价维度得分显著正向",
            "经深度学习模型推断，文本情感概率分布偏向积极区间",
            "根据语义特征提取，该语句在情感空间的正向投影明显",
            "深入分析显示，这句话明显传达积极情感信号",
            "细致研判表明，文本内容强烈呈现正向情绪",
            "多维度评估证实，该表达显著带有乐观情感倾向",
            "综合检测结果显示，语句情感基调明确偏向积极",
            "交叉验证分析指出，文字内涵高度契合正面情绪特征",
            "积极，是这句话经分析后的情感归属",
            "若论情感属性，该文本当属积极范畴",
            "这句话啊，分析下来可是满满的正能量",
            "从情感维度解读，此表达正向无疑",
            "分析结果不言而喻：文本情感积极显著",
            "通过语义分析和情感计算，该语句明确呈现积极情绪特征",
            "结合上下文理解与情感词典匹配，文本显示正向情感倾向",
            "经深度学习和规则匹配双重验证，情感属性判定为积极",
            "基于词向量分析和情感强度测算，该表达具有显著乐观色彩",
            "通过注意力机制模型与情感维度解析，确认文本积极属性",
            "实时情感分析显示当前文本呈现积极态势",
            "历时分析表明，该表达始终维持正向情感",
            "动态情感追踪显示情绪走向持续积极",
            "随着语境深入，积极情感特征愈发显著",
            "在多个分析时间节点上，情感极性稳定正向",
            "结合文本与潜在语气分析，情感判断为积极",
            "即便剥离语境，字面情感仍呈正向特征",
            "假设转换为语音，预期语调将强化积极感知",
            "在多模态分析框架下，文本情感维度显著积极",
            "即便单独分析标点使用，也支持积极情感判断",
            "在情感强度维度，该文本属于中度积极范畴",
            "根据情感颗粒度分析，细部特征均指向正向",
            "从情感层级看，既有表层积极也有深层乐观",
            "宏观情感基调与微观情感要素一致正向",
            "主情感为积极，次情感呈现希望与信心",
            "即使考虑潜在反讽可能，表层情感仍判为积极",
            "在排除修辞干扰后，基础情感属性保持正向",
            "经隐含情感解析，深层情绪维持积极判断",
            "表层积极，深层分析未发现负面情感反转",
            "结合语境消歧，最终情感评估确认为积极",
            "持续监测显示，该文本情感将保持积极走向"
    );


    @Getter
    @Setter
    @AllArgsConstructor
    @NoArgsConstructor
    public static class ExcelData {
        @ExcelProperty("语句")
        private String text;
        @ExcelProperty("分词")
        private String splitText;
        @ExcelProperty("情感标签")
        private String label;
    }

    private static List<STFDataSetItem> dataSetItemList = Lists.newArrayList();

    public static void main(String[] args) {

        // 加载 本地Excel文件 Users/lh0811/Desktop/语句情感数据集.xlsx
        String fileName = "/Users/lh0811/Desktop/dataexcel.xlsx";
        // 这里默认读取第一个sheet
        EasyExcel.read(fileName, ExcelData.class, new ReadListener<ExcelData>() {
            int i = 0;

            @Override
            public void invoke(ExcelData data, AnalysisContext analysisContext) {
                log.info("解析到一条数据:{}", JSON.toJSONString(data));
                STFDataSetItem stfDataSetItem = new STFDataSetItem();
                stfDataSetItem.setInstruction(instructionList.get(i % instructionList.size()));
                stfDataSetItem.setInput(data.getText());
                if (StringUtils.equals(data.getLabel(), "积极情感")) {
                    stfDataSetItem.setOutput(data.getSplitText() + activeList.get(i % activeList.size()));
                } else {
                    stfDataSetItem.setOutput(data.getSplitText() + disActiveList.get(i % disActiveList.size()));
                }
                dataSetItemList.add(stfDataSetItem);
                i++;
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                // 根据dataSetItemList每十条数据随机取一条
                List<STFDataSetItem> dataSetItemListNew = Lists.newArrayList();
                for (int i = 0; i < dataSetItemList.size(); i += 10) {
                    int randomIndex = i + (int) (Math.random() * Math.min(10, dataSetItemList.size() - i));
                    dataSetItemListNew.add(dataSetItemList.get(randomIndex));
                }
                // 将dataSetItemList转换为JSON并写入文件
                String jsonStr = JSON.toJSONString(dataSetItemListNew);
                String outputFilePath = "Users/lh0811/Desktop/dataSetItemList2.json";
                File outputFile = new File(outputFilePath);
                try {
                    if (!outputFile.getParentFile().exists()) {
                        outputFile.getParentFile().mkdirs();
                    }
                    try (FileWriter fileWriter = new FileWriter(outputFile)) {
                        fileWriter.write(jsonStr);
                        log.info("数据已成功写入文件: {} 共{}条", outputFilePath, dataSetItemListNew.size());
                    }
                } catch (IOException e) {
                    log.error("写入文件时发生错误: ", e);
                }
            }
        }).sheet().doRead();


    }

}
